home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
Pakiet bezpieczenstwa
/
mini Pentoo LiveCD 2006.1
/
mpentoo-2006.1.iso
/
livecd.squashfs
/
usr
/
bin
/
intltool-prepare
< prev
next >
Wrap
Text File
|
2005-10-18
|
9KB
|
344 lines
#!/usr/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*-
# Intltool .desktop, .directory Prepare Tool
#
# Copyright (C) 2001 Free Software Foundation.
#
# Intltool is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# Intltool is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# Author(s): Gediminas Paulauskas <menesis@delfi.lt>
# Kenneth Christiansen <kenneth@gnu.org>
## Release information
my $PROGRAM = "intltool-prepare";
my $PACKAGE = "intltool";
my $VERSION = "0.34.1";
## Loaded modules
use strict;
use Getopt::Long;
use File::Find;
## Scalars used by the option stuff
my $HELP_ARG = "0";
my $VERSION_ARG = "0";
my $VERBOSE = "0";
my @languages;
my @desktop_files;
my $new;
my $file;
my $desktop_extension = "(desktop|soundlist|keys|directory)";
my $keywords = "Name|Comment|GenericName|SwallowTitle|description";
## Always print as the first thing
$| = 1;
## Handle options
GetOptions (
"help|h" => \$HELP_ARG,
"version|v" => \$VERSION_ARG,
"verbose|x" => \$VERBOSE
) or &invalid_option;
## Use the supplied arguments
## Check for options.
## This section will check for the different options.
sub split_on_argument {
if ($VERSION_ARG) {
&version;
} elsif ($HELP_ARG) {
&help;
} else {
&main;
}
}
&split_on_argument;
sub main
{
print "Working, please wait...\n" if (! $VERBOSE);
&find_desktop_files;
&append_keywords;
&add_to_potfiles;
&perform_rescue;
&add_to_cvsignore;
&fix_makefiles;
&generate_empty;
}
sub version {
print <<_EOF_;
${PROGRAM} ${PACKAGE} $VERSION
Written by Gediminas Paulauskas <menesis\@delfi.lt>, 2000.
Copyright (C) 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
_EOF_
exit;
}
sub help
{
print <<_EOF_;
Usage: ${PROGRAM} [OPTION] KEYWORD...
Automates preparation steps before software make use of intltool.
KEYWORD is a list of additional key other than "Name", "Comment"
and "description".
-h, --help shows this help page
-v, --version shows the version
-x, --verbose show lots of feedback
Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
or send email to <xml-i18n-tools\@gnome.org>.
_EOF_
exit;
}
sub invalid_option
{
## Handle invalid arguments
## my $opt = $ARGV[0];
## print "$PROGRAM: invalid option -- $opt\n";
print STDERR "Try `$PROGRAM --help' for more information.\n";
exit 1;
}
sub append_keywords
{
my $arg;
foreach $arg (@ARGV) {
$keywords .= "|$arg";
}
}
sub add_to_potfiles
{
open FILE, ">>po/POTFILES.in";
my $intro = 0;
foreach my $desktop (@desktop_files) {
next if contains("po/POTFILES.in", "$desktop.in");
# Print explanation comment only once
unless ($intro) {
print FILE "# files added by intltool-prepare\n";
$intro = 1;
}
print FILE "$desktop.in\n";
}
close FILE;
}
sub perform_rescue
{
foreach $file (@desktop_files) {
&rescue_file($file);
}
}
sub rescue_file
{
my ($filename) = @_;
my ($msgid, $line, $lang);
print "Rescuing translations from $filename ...\n" if $VERBOSE;
open ORIG, "<$filename";
$line = 1;
ENTRY: while (<ORIG>) {
chomp;
$line++;
my $entry = $_;
if (($entry =~ /^($keywords)=(.*)$/) ||
($entry =~ /^(\s*description)=(.*)$/)) {
$msgid = $2;
$msgid =~ s/\\/\\\\/g;
$msgid =~ s/\"/\\"/g;
} elsif (($entry =~ /^($keywords)\[(.*?)\]=(.*)$/) ||
($entry =~ /^(\s*\[)(.*?)\]description=(.*)$/)) {
$lang = $2;
my $msgstr = $3;
$msgstr =~ s/\\/\\\\/g;
$msgstr =~ s/"/\\"/g;
$line--;
if ((-s "po/$lang.po") &&
(contains("po/$lang.po", "msgid \"$msgid\""))) {
next ENTRY;
}
open POFILE, ">>po/$lang.po";
print POFILE "\n#: $filename.in:$line\n";
print POFILE "msgid \"$msgid\"\n";
print POFILE "msgstr \"$msgstr\"\n";
close POFILE;
}
}
}
sub generate_empty
{
my $all = ' ';
foreach my $full (@desktop_files) {
$new = "$full.in";
$all .= "$new ";
print "Generating empty $new ...\n" if $VERBOSE;
open FULL, "<$full";
open NEW, ">$new";
while (<FULL>) {
unless (
(/^($keywords)\[.*?\]=.*$/) ||
(/^\s*\[(.*?)\]description=.*$/)
) {
if (/^($keywords)=.*$/) {
print NEW "_$_";
} elsif (/^(\s*)(description=.*)$/) {
print NEW "$1_$2\n";
} else {
print NEW;
}
}
}
close NEW;
}
unless ($all eq ' ') {
print "*** Please add these files to CVS by following command: ***\n"
. "cvs add$all\n";
}
}
sub add_to_cvsignore
{
my $all = ' ';
my $ign;
foreach $file (@desktop_files) {
$file =~ /^(.*\/)?(.+?\.$desktop_extension$)$/;
if ($1) {
$ign = "$1.cvsignore";
} else {
$ign = ".cvsignore";
}
my $basename = $2;
next if contains($ign, $basename);
print "Appending $basename to $ign\n" if $VERBOSE;
open FILE, ">>$ign";
print FILE "$basename\n";
$all .= "$file ";
}
close FILE;
unless ($all eq ' ') {
print "*** Please remove files from CVS by following command: ***\n"
. "cvs remove -f$all\n";
}
}
sub fix_makefiles
{
my $file;
foreach $file (@desktop_files) {
my ($makefile, $line);
$file =~ /^(.*\/)?(.+?\.$desktop_extension$)$/;
if ($1) {
$makefile = "$1Makefile.am";
} else {
$makefile = "Makefile.am";
}
my $basename = $2;
print "Fixing $basename entry in $makefile\n" if $VERBOSE;
open MAKE, $makefile;
open NEWMAKE, ">$makefile.new";
my $extra = 0;
while ($line = <MAKE>) {
$extra = 1 if $line =~ /^EXTRA_DIST/;
if ($extra) {
if (($line =~ /$basename/) &&
!($line =~ /$basename\.in/)) {
$line =~ s/$basename/$basename\.in/;
}
$extra = 0 unless $line =~ /\\\s*$/
} else {
if ($line =~ /^(\w+)_DATA\s*=\s*$basename\s*$/) {
my $name = $1;
$line =~ s/^$name\_DATA/$name\_in_files/;
$line =~ s/$basename/$basename\.in/;
$basename =~ /\.($desktop_extension)$/;
my $ext = $1;
$line .= "$name\_DATA = \$($name\_in_files:.$ext.in=.$ext)\n";
$ext =~ tr/a-z/A-Z/;
if (!contains($makefile, "\@INTLTOOL_$ext\_RULE\@")) {
$line .= "\@INTLTOOL_$ext\_RULE\@\n";
}
}
}
print NEWMAKE $line;
}
close NEWMAKE;
rename "$makefile.new", $makefile;
}
}
sub contains
{
my ($name, $str) = @_;
open CONT, "<$name";
while (<CONT>) {
chomp;
return 1 if $_ eq $str;
}
return 0;
}
sub find_desktop_files
{
if ($VERBOSE) {
print "Found these interesting files:\n";
} else {
print "Finding interesting files...";
}
find (\&wanted, '.');
print "done\n" unless $VERBOSE;
}
sub wanted
{
if (/\.$desktop_extension$/) {
my $file = $File::Find::name;
$file =~ s/\.\///;
push @desktop_files, $file;
print "$file\n" if $VERBOSE;
}
}
# vim: ts=4 sw=4 expandtab